# -*- coding: utf-8 -*- 
# @project : 《Atcoder》
# @Author : created by bensonrachel on 2021/9/28
# @File : 16.E - Peddler.py

from collections import deque
import sys
MaxInt = sys.maxsize
def re_dag_solve():
    ans = -(10**9+1)
    Q = deque([i for i in range(0, N) if indegree[i] == 0])  # 入度为0的入队
    dp = [a[i] for i in range(0, N)]#初始化为a[i]，因为包括自己。
    while Q:
        v = Q.popleft()
        for u in table[v]:
            dp[u] = min(dp[u],dp[v])
            ans = max(ans, a[u] - dp[v])#每次都要判断一下是否产生最大利润，是就更新。共M次判断。因为包括i点，所以这里要用dp[v]而不是dp[u]
            indegree[u] -= 1
            if indegree[u] == 0:  # 新的变成了入度为0的入队
                Q.append(u)
    return ans

def re_dag_solve2():
    ans = -(10**9+1)
    Q = deque([i for i in range(0, N) if indegree[i] == 0])  # 入度为0的入队
    dp = [MaxInt for _ in range(0, N)]# 这里要用最大的，不然会漏掉一种情况。因为一开始入度为0的点一直都是MaxInt（*）
    while Q:
        v = Q.popleft()
        ans = max(ans, a[v] - dp[v])#（*）也可以不用后面的循环，直接在这里更新ans
        for u in table[v]:
            dp[u] = min(dp[u],dp[v],a[v])#为什么要三个一起判断呢，dp[u]代表本节点的dp[u]原值，可能是被更新过也可能是第一次更新，所以一定是需要的，dp[v]代表u的前缀的（不包括v点）的最小出买卖值，再加上后面的a[v]一起比较，才能得出dp[u]，
                                         #也就是此轮到达u点之前（不包括u点）的最小出买卖值.
            indegree[u] -= 1
            if indegree[u] == 0:  # 新的变成了入度为0的入队
                Q.append(u)
    # for i in range(N):
    #     ans = max(ans,a[i]-dp[i])
    return ans

"""
还是DAG遍历的代码框架。但是dp要改一下。两个方法的dp[i]含义不一样。
solve1：dp[i]定义为到达i点之前（包括i点）的最小出买卖值。
solve2：dp[i]定义为到达i点之前（不包括i点）的最小出买卖值。最后再用max（a[i]-dp[i]）求最大的一个利润

也可以倒序求DP[i]为第i个城镇可以到达的所有城镇中最高黄金价格（i之后中的最大值）
（*）处注意下面这个案例
2 1
1000000000 1
1 2
"""
if __name__ == '__main__':
    N, M = map(int, input().split())

    table = [list() for i in range(N)]
    indegree = [0] * (N)

    a = [int(i) for i in input().split()]

    for _ in range(M):
        x,y = map(int, input().split())
        table[x-1].append(y-1)
        indegree[y-1] += 1
    res = re_dag_solve2()
    print(res)